﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DOMINIO;
using DAL.ConexionBD;
using System.Data.SqlClient;
using System.Data;

namespace DAL
{
    public class PedidoDAL
    {
        private SqlConnection cnn;

        public void Guardar(Pedido pedido)
        {
            DetallePedidoDAL detalle = new DetallePedidoDAL();

            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_registrarPedido", cnn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@Id", pedido.Id);
            cmd.Parameters["@Id"].Direction = ParameterDirection.InputOutput;
            cmd.Parameters.AddWithValue("@IdEmpleado", pedido.IdEmpleado);
            cmd.Parameters.AddWithValue("@IdProveedor", pedido.IdProveedor);
            cmd.Parameters.AddWithValue("@Fecha", pedido.Fecha);
            cmd.Parameters.AddWithValue("@Total", pedido.Total);
            cmd.Parameters.AddWithValue("@Activar", pedido.Activo);

            try
            {
                cnn.Open();
                cmd.ExecuteNonQuery();
                pedido.Id = (Int32)(cmd.Parameters["@Id"].Value);
                detalle.Detalle(pedido.Detalle, pedido.Id);
            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }
            cnn.Close();
        }

        public List<Pedido> BuscarPedidos()
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_BuscarPedidos", cnn);
            cmd.CommandType = CommandType.StoredProcedure;

            return SelectFactory(cnn, cmd);
        }

        public Pedido BuscarPorID(int Id)
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_BuscarPedidoPorID", cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Id", Id);

            return SelectFactory(cnn, cmd)[0];
        }

        public List<Pedido> BuscarPorProveedor(String nombre)
        {
            cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
            SqlCommand cmd = new SqlCommand("PA_BuscarPedidoPorProveedor", cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@nombre", nombre);

            return SelectFactory(cnn, cmd);
        }

        private static List<Pedido> SelectFactory(SqlConnection cnx, SqlCommand cmd)
        {
            cnx.Open();

            SqlDataReader DR = cmd.ExecuteReader();
            List<Pedido> ListaPedido = new List<Pedido>();

            while (DR.Read())
            {
                Pedido pedido = new Pedido();
                EmpleadoDAL empDAL = new EmpleadoDAL();
                ProveedorDAL provDAL = new ProveedorDAL();
                DetallePedidoDAL detDAL = new DetallePedidoDAL();

                pedido.Id = DR.GetInt32(0);
                pedido.IdEmpleado = DR.GetInt32(1);
                pedido.IdProveedor = DR.GetInt32(2);
                pedido.Fecha = DR.GetDateTime(3);
                pedido.Total = DR.GetDecimal(4);
                pedido.Activo = DR.GetBoolean(5);

                pedido.EmpleadoA = empDAL.BuscarEmpleadoPorCodigo(pedido.IdEmpleado);
                pedido.ProveedorA = provDAL.BuscarProveedorPorCodigo(pedido.IdProveedor);
                pedido.Detalle = detDAL.BuscarDetallePorIdPedido(pedido.Id);

                ListaPedido.Add(pedido);
            }
            cnx.Close();
            return ListaPedido;
        }
    }
}
